java.lang.Object
中的Object
是所有class
的super class
,不管是哪個class
,最終都會繼承
到它。
Object class
中沒有宣告任何的屬性
只有方法
,並且也只有一個沒有任何參數
的constructor
。
Object.clone()
:複製一個class
。 (會在Heap
中放入一個新的,位址值
跟與被複製的不同
)
public class Person {
public static void main(String[] args) {
String[] str = new String[5]; 位址值1
String[] str1 = str.clone(); // 位址值2
}
}
Object.**finalize()
:**會在物件被垃圾回收器(GC
)回收前做某些事,JDK9後不建議使用。
public class Person {
protected void ~~finalize~~() {
System.out.println("我要被回收啦!!!");
}
}
Object.equals()
:用來比較兩個物件是否相等,只能使用在引用數據類型
,若是沒有重寫(override
)時,比較的是兩個物件的位址值
,一般會重寫。
public class Person {
public static void main(String[] args) {
int[] i1 = new int[5];
int[] i2 = new int[5];
System.out.println(i1.equals(i2)); // false
}
}
由於Object.equals()
所比較的是位址值,所以i1
i2
不會相等。
一般重寫Object.equals()
的方式:(比較類中的屬性是否相等)。
class Person {
String name;
int age;
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instaceOf Person) {
Person person = (Person) obj;
return this.age == person.age && this.name.equals(person.name);
}
return false;
}
}
逐行解釋:
this
(本身)和參數
的位址值
是否相等,若相等代表指向同一個位置,因此一定會相等。instanceOf
先確認參數
是否為sub class
(昨天多態中有提到過),如果符合的話,先將參數
進行強制轉換
,再去比較每一個屬性
是否相等。name
是String
類型(引用類型),所以無法使用==
進行比較,而是使用String類
中已經重寫
過的equals
方法去進行值的比較。Object.toString()
:將物件所對應的位址值
轉換為String
,一般也會進行重寫
,將物件中的屬性轉換成String
後印出。
public class Person {
public static void main(String[] args) {
int[] i1 = new int[5];
System.out.println(i1); //I@16b12f91
System.out.println(i1.toString()); //I@16b12f91
}
}
System.out.println()
到最後也是會調用了Object.toString()
,所以當在System.out.println()
內寫一個物件時,不論有沒有寫toString()
,最終都會調用到toString()
方法本身。
一般重寫Object.toString()
的方式:(將屬性和值變為String
)。
class Person {
String name;
int age;
String job;
public String toString() {
return "Person{ name = " + name + ", age = " + age + ", job = " + job + " }";
}
}
會將屬性
、值
和class name
變為String
後返回。